#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
/*
int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);
参数解析:
argc，argv:同main函数参数
optsring:短参数,如abc:d::
    1.单个字符，表示选项，
    2.单个字符后有一个冒号：表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
    3 单个字符后有两个冒号，表示该选项后可以有参数也可以没有参数。如果有参数同上但不能空格隔开。该参数的指针赋给optarg。

longopts:支持长参数的数据结构
longindex:*/
/*
struct option
{
  const char *name;//长参数名
  int has_arg;//是否
  int *flag;//指定如何返回长选项的结果。如果flag为NULL，那么getopt_long（）将返回val.
  int val;//如果flag为NULL，这返回val
};*/
struct option ops[] =
{
    {"ace", no_argument, NULL, 'a'},
        {"bsd", no_argument, NULL, 'b'},
        {"cad", no_argument, NULL, 'a'},
        0, 0, 0, 0
};
const char *opstring = "ab:c::";

int main(int argc,char **argv){
    int ret = -1;
    while((ret =getopt_long(argc,argv,opstring,ops,NULL))){
        switch (ret){
        case 'a':
            puts("a");
            printf("opttind :%d\n",optind);
            printf("optargs :%s\n",optarg);
            break;
        case 'b':
            puts("b");
            printf("opttind :%d\n",optind);
            printf("optargs :%s\n",optarg);break;
        case 'c':
            puts("c");
            printf("opttind :%d\n",optind);
            printf("optargs :%s\n",optarg);break;
        default:
            return 1;
        }
    }
    return 0;
}